package com.smartandroid.sa.tag.helper;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

/**
 * Provides a descending iterator and other 1.6 methods to allow support on the
 * 1.5 JRE.
 */
public class DescendableLinkedList<E> extends LinkedList<E> {

	/**
	 * Create a new DescendableLinkedList.
	 */
	public DescendableLinkedList() {
		super();
	}

	/**
	 * Add a new element to the start of the list.
	 * 
	 * @param e
	 *            element to add
	 */
	public void push(E e) {
		addFirst(e);
	}

	/**
	 * Look at the last element, if there is one.
	 * 
	 * @return the last element, or null
	 */
	public E peekLast() {
		return size() == 0 ? null : getLast();
	}

	/**
	 * Remove and return the last element, if there is one
	 * 
	 * @return the last element, or null
	 */
	public E pollLast() {
		return size() == 0 ? null : removeLast();
	}

	/**
	 * Get an iterator that starts and the end of the list and works towards the
	 * start.
	 * 
	 * @return an iterator that starts and the end of the list and works towards
	 *         the start.
	 */
	public Iterator<E> descendingIterator() {
		return new DescendingIterator<E>(size());
	}

	private class DescendingIterator<E> implements Iterator<E> {
		private final ListIterator<E> iter;

		@SuppressWarnings("unchecked")
		private DescendingIterator(int index) {
			iter = (ListIterator<E>) listIterator(index);
		}

		/**
		 * Check if there is another element on the list.
		 * 
		 * @return if another element
		 */
		public boolean hasNext() {
			return iter.hasPrevious();
		}

		/**
		 * Get the next element.
		 * 
		 * @return the next element.
		 */
		public E next() {
			return iter.previous();
		}

		/**
		 * Remove the current element.
		 */
		public void remove() {
			iter.remove();
		}
	}
}
